// Copyright 2010, Vanya Davidenko.
// Используемая кодировка: UTF-8.

#ifndef LIBV_CWD_H_
#define LIBV_CWD_H_

#include <memory>
#include <string>

#include <libv/check.h>

#ifdef _WIN32
# include <direct.h>
#else
# include <cstdlib>
# include <unistd.h>
#endif  // _WIN32



namespace libv
{

#ifdef _WIN32

/** Функция возвращает путь к текущей директории.
  * @note Полученный путь не будет завершаться на косую черту, кроме случая,
  *       когда текущая рабочая директория — корень (примеры: "c:\" или "/").
  * @exception libv::CheckException. */
inline ::std::string CurrentWorkingDirectory()
{
    // http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath
    const size_t max_path_size = 32767;  // максимальный путь в windows

    ::std::auto_ptr<char> buf(new char[max_path_size]);
    VERIFY(_getcwd(buf.get(), max_path_size) != NULL);
    return ::std::string(buf.get());
}


#else


inline ::std::string CurrentWorkingDirectory()
{
    const long int max_path_size = pathconf(".", _PC_PATH_MAX);
    ::std::auto_ptr<char> buf(new char[max_path_size]);
    VERIFY(getcwd(buf.get(), static_cast<size_t>(max_path_size)) != NULL);
    return ::std::string(buf.get());
}

#endif  // _WIN32

}  // libv

#endif  // LIBV_CWD_H_
